/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Tipos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.ErroSintatico;
import analiseSintatica.estruturadados.NoArvore;

import java.util.ArrayList;
import java.util.LinkedList;

/**
 *
 * @author aluno
 * @author amferraz
 */
public class RegraTipoPrimitivo extends Regra{

    protected static Regra instancia;

    protected String estrutura = "<tipo_primitivo> ::= char | int | float | boolean";

    private ArrayList<ErroSintatico> erros = new ArrayList<ErroSintatico>();

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraTipoPrimitivo() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraTipoPrimitivo getInstance() {
        if (instancia == null) {
            instancia = new RegraTipoPrimitivo();
        }
        return (RegraTipoPrimitivo) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        NoArvore no = new NoArvore("<tipo_primitivo>", false);

      /*  if (listaTokens.getFirst().getToken().equals("identificador")){
           if ( (listaTokens.getFirst().getLexema().equals("char"))||
                (listaTokens.getFirst().getLexema().equals("int"))||
                (listaTokens.getFirst().getLexema().equals("float"))||
                (listaTokens.getFirst().getLexema().equals("boolean")) ){
               no.adicionaFilho( new NoArvore(listaTokens.pop().getLexema(), true));
           }
           else{
               this.erros.add(new ErroSintatico("Tipo primitivo esperado", estrutura, listaTokens.getFirst().getLinha()));
           }
        }
        else{
            this.erros.add(new ErroSintatico("Não foi encontrado um identificador.", estrutura, listaTokens.getFirst().getLinha()));

        }*/
        if ( (listaTokens.getFirst().getLexema().equals("char"))||
                (listaTokens.getFirst().getLexema().equals("int"))||
                (listaTokens.getFirst().getLexema().equals("float"))||
                (listaTokens.getFirst().getLexema().equals("boolean")) ){
            no.adicionaFilho(reconheceLexema(listaTokens,listaTokens.getFirst().getToken(),listaTokens.getFirst().getLexema(),estrutura));
        }
        else{
               this.erros.add(new ErroSintatico("Tipo primitivo esperado", estrutura, listaTokens.getFirst().getLinha()));
           }
        if (this.erros.size()>0){
            ErroSintaticoException excecao = new ErroSintaticoException();
            excecao.addErros(this.erros);

            throw excecao;
            
        }
        System.out.println("Terminei Regra Tipo Primitivo");
        return no;
    }



    @Override
    protected void setPrimeiro() {
        this.primeiro.add("char");
        this.primeiro.add("int");
        this.primeiro.add("float");
        this.primeiro.add("boolean");
    }

    @Override
    protected void setSeguinte() {
       //S<tipo_primitivo> = {identificador, *, ) }  U S<tipo>
        this.seguinte.add("identificador");
        this.seguinte.add("*");
        this.seguinte.add(")");
    }

    
}
